package service.config;

import com.alibaba.fastjson.JSONObject;
import entity.config.ConfigInfo;
import utils.common.StrUtil;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Enumeration;
import java.util.Properties;

/**
 * 读取配置文件并转为配置类
 */
public class ConfigService {

    private String url;

    public ConfigService() {

    }

    public ConfigService(String url) {
        this.url = url;
    }

    /**
     * 读取配置文件
     * "./src/config/config.properties"
     */
    public ConfigInfo readConfig() {
        return this.readConfig(this.url);
    }

    /**
     * 从指定配置文件读取数据
     */
    public ConfigInfo readConfig(String url) {
        Properties properties = new Properties();
        BufferedReader bufferedReader = null;
        try {
            // 使用ClassLoader加载properties配置文件生成对应的输入流
            bufferedReader = new BufferedReader(new FileReader(url));
            // 使用properties对象加载输入流
            properties.load(bufferedReader);

            // 获取属性
            Enumeration enumeration = properties.propertyNames();
            JSONObject jsonObject = new JSONObject();
            while (enumeration.hasMoreElements()) {
                String strKey = (String) enumeration.nextElement();
                String strValue = properties.getProperty(strKey);
                // 读取配置文件中的属性值
                read(jsonObject, strKey, strValue);
            }
            // 转为配置文件类
            return JSONObject.parseObject(jsonObject.toJSONString(), ConfigInfo.class);

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (bufferedReader != null) {
                try {
                    bufferedReader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return null;
    }

    /**
     * 将配置文件中的数据转为 map 存储
     */
    private void read(JSONObject jsonObject, String field, String value) {
        int lengthIndex = field.length(); // 最大长度
        int endIndex = field.indexOf("."); // 第一次出现的位置
        endIndex = endIndex == -1 ? lengthIndex : endIndex; // 计算字段截取位置

        String key = field.substring(0, endIndex); // 获得字段
        if (StrUtil.isEmpty(key)) {
            return;
        }
        if (endIndex == lengthIndex) {
            // 字段截取位置 = 最大长度，说明是属性
            jsonObject.put(key, value);
            return;
        }

        // 字段截取位置 != 最大长度，说明有下级子类
        JSONObject child = jsonObject.getJSONObject(key);
        if (child == null) {
            child = new JSONObject();
            jsonObject.put(key, child);
        }
        // 递归调用自己
        read(child, field.substring(endIndex + 1, lengthIndex), value);

    }

    public static void main(String args[]) throws Exception {
        // File.separator
        //System.out.println(System.getProperty("java.io.tmpdir"));

        String url = "C:/z/kalimdor/code/src/main/resources/kalimdor/code-generation.properties";
        ConfigInfo configInfo = new ConfigService(url).readConfig();
        System.out.println(JSONObject.toJSON(configInfo));
    }
}
